'use strict'

const titbit = require('titbit')
const parsexml = require('xml2js').parseString
const wxmsg = require('./wxlib/weixinmsg')
const crypto = require('crypto')

const app = new titbit({
  debug: true,
})

//验证消息来源的中间件
app.use(async (c, next) => {
  //这里需要换成你自己的token
  let token = 'ok12345'
  let urlargs = [
    c.query.nonce,
    c.query.timestamp,
    token
  ];

  //字典排序
  urlargs.sort()

  //拼接成字符串
  let onestr = urlargs.join('')

  //生成sha1签名字符串
  let hash = crypto.createHash('sha1')
  let sign = hash.update(onestr)

  if (c.query.signature === sign.digest('hex')) {
    await next()
  }

})

app.get('/msg/talk', async c => {
  c.res.body = c.query.echostr
})

app.post('/msg/talk', async c => {
  try {
    var xmlmsg = await new Promise((rv, rj) => {

        //explicitArray 为false表示不会把单个的标签解析成数组，
        //符合正常的使用习惯，否则所有标签都是数组类型，访问比较麻烦。
        parsexml(c.body, {explicitArray : false}, (err, result) => {
            if (err) {
                rj(err)
            } else {
                rv(result.xml)
            }
        })
    })

    var data = {
        touser      : xmlmsg.FromUserName,
        fromuser    : xmlmsg.ToUserName,
        msg         : xmlmsg.Content,
        msgtime     : parseInt(Date.now() / 1000),
        msgtype     : ''
    };

    //交给派发函数处理
    c.res.body = wxmsg.msgDispatch(xmlmsg, data);

  } catch (err) {
    console.error(err)
  }
})

//换成你自己的端口号
//要在后台运行则可以使用setsid命令，示例：setsid node wxmsg.js
app.run(3333)
